package org.jaaksi.router

import com.android.build.gradle.AppPlugin
import com.android.build.gradle.LibraryPlugin
import org.gradle.api.Plugin
import org.gradle.api.Project
import org.gradle.api.initialization.dsl.ScriptHandler
import org.gradle.api.plugins.ExtraPropertiesExtension

class RouterPlugin implements Plugin<Project> {
  static final String APT_OPTION_NAME = "moduleName"

  String DEFAULT_ROUTER_RUNTIME_VERSION = "1.6.2"
  String DEFAULT_ROUTER_COMPILER_VERSION = "1.6.2"
  // app使用的gradle版本号
  String androidBuildGradleVersion

  @Override
  void apply(Project project) {
    // 通常情况下，插件使用方需要传入一些配置参数
    // org.gradle.api.Project 有一个 ExtensionContainer getExtensions() 方法，可以用来实现这个传递。
    // create 方法的第一个参数就是你在 build.gradle 文件中的进行参数配置的 dsl 的名字，必须一致；
    // 第二个参数，就是参数的类型
    println '======================='
    println 'this is RouterPlugin.'
    println '======================='
    println '======classpath========'

//     遍历根目录的build.gradle文件，找到buildscript，遍历下面所有的元素，找到classpath
    project.rootProject.buildscript.configurations.each {
      if (it.name == ScriptHandler.CLASSPATH_CONFIGURATION) {
        // classpath
        it.resolvedConfiguration.firstLevelModuleDependencies.each {
          // com.android.tools.build:gradle:3.3.2
           println("${it.moduleGroup}:${it.moduleName}:${it.moduleVersion}")
          if (it.moduleGroup == "com.android.tools.build" && it.moduleName == "gradle") {
            androidBuildGradleVersion = it.moduleVersion
          }
        }
      }
    }
    if (!androidBuildGradleVersion) {
      throw new IllegalArgumentException("Unknown android build gradle plugin version.")
    }
    String compileConf = 'compile'
    if (is3_xVersion()) {
      compileConf = 'implementation'
    }
    String aptConf = 'annotationProcessor'

    // org.gradle.api.internal.plugins.DefaultExtraPropertiesExtension
    // 读取根project下的ext字段
    ExtraPropertiesExtension ext = project.rootProject.ext
    if (ext.has("routerVersion")) {
      DEFAULT_ROUTER_RUNTIME_VERSION = ext.get("routerVersion")
    }
    if (ext.has("compilerVersion")) {
      DEFAULT_ROUTER_COMPILER_VERSION = ext.get("compilerVersion")
    }
    // 添加依赖语句
//    project.dependencies.add(compileConf,
//        "com.chenenyu.router:router:${DEFAULT_ROUTER_RUNTIME_VERSION}")
//    project.dependencies.add(aptConf,
//        "com.chenenyu.router:compiler:${DEFAULT_ROUTER_COMPILER_VERSION}")

    //获取到Extension，Extension就是 build.gradle中的{}闭包
    def android = project.extensions.findByName("android")
    // todo 这里是干嘛的？
//    if (android) {
//      android.defaultConfig.javaCompileOptions.annotationProcessorOptions.argument(APT_OPTION_NAME, project.name)
//      android.productFlavors.all {
//        it.javaCompileOptions.annotationProcessorOptions.argument(APT_OPTION_NAME, project.name)
//      }
//    }

    if (project.plugins.hasPlugin(AppPlugin)) { // 判断是否有application moduel
        println 'hasPlugin AppPlugin...'
      // 注册Transform
      def transform = new RouterTransform(project)
      android.registerTransform(transform)
    }

    if (project.plugins.hasPlugin(LibraryPlugin)) { // 判断是否有library module
      println 'hasPlugin LibraryPlugin...'
    }
  }

  /**
   * Whether the android gradle plugin version is 3.x
   */
  boolean is3_xVersion() {
    return androidBuildGradleVersion.split("\\.")[0].toInteger() >= 3
  }
}